package paa.simulator.grafo;

import java.util.Map;
import java.util.WeakHashMap;

public class PessoaPool {
	private static PessoaPool instance;
	private Map<Integer, Pessoa> pool;

	private PessoaPool() {
		this.pool = new WeakHashMap<Integer, Pessoa>();
	}
	
	public static PessoaPool getInstance() {
		
		if (instance == null) {
			instance = new PessoaPool();
		}
		
		return instance;
	}
	
	public Pessoa getPessoa(Integer id) {
		Pessoa pessoa = this.pool.get(id);
		return pessoa;
	}
	
	public Pessoa putPessoa(Integer id, Favoritos fav, Subscriptions subs, Uploads ups) {
		if (pool.containsKey(id)) {
			throw new RuntimeException("Repeated User " + id);
		}
		
		Pessoa pessoa = new Pessoa(id, fav, subs, ups);
		this.pool.put(id, pessoa);
		return pessoa;
	}
	
	public Pessoa overwritePessoa(Integer id, Favoritos fav, Subscriptions subs, Uploads ups) {
		Pessoa pessoa = this.pool.get(id);
		
		if (pessoa != null) {
			pessoa.setId(id);
			pessoa.setFavoritos(fav);
			pessoa.setSubscriptions(subs);
			pessoa.setUploads(ups);
		} else {
			pessoa = new Pessoa(id, fav, subs, ups);
			this.pool.put(id, pessoa);
		}
		
		return pessoa;
	}
	
	public Pessoa removePessoa(Integer id) {
		return this.pool.remove(id);
	}
	
	public class Pessoa {

		private int id;
		private Favoritos fav;
		private Uploads ups;
		private Subscriptions subs;

		private Pessoa(int id, Favoritos fav, Subscriptions subs, Uploads ups) {
			this.id = id;
			this.fav = fav;
			this.subs = subs;
			this.ups = ups;
		}
		
		public Favoritos getFavoritos() {
			return fav;
		}
		
		public Uploads getUploads() {
			return ups;
		}
		
		public Subscriptions getSubscriptions() {
			return subs;
		}
		
		public int getID() {
			return id;
		}

		private void setSubscriptions(Subscriptions subs) {
			this.subs = subs;
		}
		
		private void setFavoritos(Favoritos fav) {
			this.fav = fav;
		}
		
		private void setUploads(Uploads ups) {
			this.ups = ups;
		}
		
		private void setId(int id) {
			this.id = id;
		}
		
		@Override
		public String toString() {
			return id+"";
		}
		
		@Override
		public int hashCode() {
			return id;
		}
		
		@Override
		public boolean equals(Object obj) {
			if (obj instanceof Pessoa) {
				Pessoa opv = (Pessoa) obj;
				return opv.id == id;
			}
			return false;
		}
	}	
}
